/*
 * @Author: 晴鸢. 3013433857@qq.com
 * @Date: 2025-11-03 23:44:51
 * @LastEditors: 晴鸢. 3013433857@qq.com
 * @LastEditTime: 2025-11-03 23:44:54
 * @FilePath: /Learn/WebCalculator/Daemon.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once
#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<signal.h>
#include<string>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
const std::string nullfile="/dev/null";
//创建守护进程
void Daemon(const std::string&cwd="")
{
    //1.忽略其他异常信号
    signal(SIGCLD,SIG_IGN);
    signal(SIGPIPE,SIG_IGN);
    signal(SIGSTOP,SIG_IGN);
    //2.将自己变成独立的会话
    if(fork()>0) exit(0);
    setsid();

    //3.更改当前的工作目录 避免因为当前目录被删除导致进程退出
    if(!cwd.empty()) chdir(cwd.c_str());

    //4.标准输入，标准输出，标准错误重定向至/dev/null（黑洞设备，所有写入他的信息会被丢弃）
    int fd=open(nullfile.c_str(),O_RDWR);
    if(fd>0)
    {
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);
        close(fd);
    }
}